package gui.logado.mensagens.receber;

import conexao.Http;
import conexao.HttpData;
import conexao.HttpListener;
import gui.utilitarias.filemanager.SelecionaListener;
import gui.utilitarias.filemanager.SelecionarArquivo;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
import javax.microedition.lcdui.*;
import recados.Recados;

public class Anexo extends Form implements CommandListener, SelecionaListener, Runnable, HttpListener, ItemCommandListener {

    //GUI
    private final TextField campoPasta;
    private final Command cmdVoltar;
    private final Command cmdProcurar;
    private final Command cmdBaixar;
    //Mensagem que contem anexo
    private final Mensagem mensagem;
    //Tela anterior
    private Displayable back;
    private Http http;

    public Anexo(Mensagem m) {
        super("Salvar Anexo");

        this.mensagem = m;

        campoPasta = new TextField("Pasta:", null, 200, TextField.URL | TextField.UNEDITABLE);
        append(campoPasta);

        cmdProcurar = new Command("Procurar", Command.ITEM, 0);
        campoPasta.addCommand(cmdProcurar);
        campoPasta.setItemCommandListener(this);

        cmdVoltar = new Command("Voltar", Command.BACK, 0);
        cmdBaixar = new Command("Baixar", Command.OK, 1);

        addCommand(cmdVoltar);
        addCommand(cmdBaixar);

        setCommandListener(this);
    }

    public void commandAction(Command c, Displayable d) {
        if (c == cmdVoltar) {
            Recados.setCurrent(back);
        } else if (c == cmdBaixar) {
            if (campoPasta.size() > 0) {
                new Thread(this).start();
            } else {
                Recados.setCurrent(new Alert("Erro", "Escolha o diretorio", null, AlertType.ERROR), this);
            }
        }
    }

    public void arquivoSelecionado(String url) {
        Recados midlet = Recados.getInstance();

        if (url == null) {
            Recados.setCurrent(this);
            return;
        }

        campoPasta.setString("file:///" + url);
        Recados.setCurrent(this);
    }

    public void run() {
        http = new Http("Baixando Anexo");
        HttpData dados = new HttpData();
        http.setHttpData(dados);

        dados.setPagina("/recuperar_anexo.php");
        http.setListener(this);

        Recados midlet = Recados.getInstance();

        dados.put("id", mensagem.getId());
        dados.put("nome", midlet.getLoginConfig().getNome());
        dados.put("senha", midlet.getLoginConfig().getSenha());

        Recados.setCurrent(http);

        http.doPost(false);
    }

    public void requisicaoConcluida(DataInputStream in) {
        try {
            String linha = Http.readLine(in);

            if (linha.equals("erro")) {
                String mensagem_erro = Http.readLine(in);
                Recados.setCurrent(new Alert("Erro", mensagem_erro, null, AlertType.ERROR), this);
                return;
            }

            FileConnection conn = (FileConnection) Connector.open(campoPasta.getString() + mensagem.getNome());

            if (!conn.exists()) {
                conn.create();
            }

            DataOutputStream out = conn.openDataOutputStream();

            byte[] buf = new byte[1024];

            boolean bytes = Recados.getInstance().getConfig().isBytes();

            int total = bytes ? Integer.parseInt(linha) : Integer.parseInt(linha) / 1024;

            int baixado = 0;

            for (int read = 0; read != -1; read = in.read(buf)) {
                out.write(buf, 0, read);
                out.flush();

                baixado += read;

                http.setMensagem("Baixando: " + (bytes ? baixado : baixado / 1024) + "/" + total);
            }

            out.close();

            String url = campoPasta.getString();
            Recados.setCurrent(new Alert("Concluido", "Arquivo salvo com sucesso em " + url.substring(url.lastIndexOf('/') + 1, url.length() - 2) + " !", null, AlertType.ERROR), back);

            conn.close();
        } catch (IOException ex) {
            Recados.setCurrent(new Alert("Erro", "Problema ao salvar arquivo", null, AlertType.ERROR), this);
        }
    }

    public void requisicaoCancelada() {
        Recados.setCurrent(this);
    }

    public void falhaRequisiçao(String mensagem) {
        Recados.setCurrent(new Alert("Erro", mensagem, null, AlertType.ERROR), this);
    }

    public void setBack(Displayable back) {
        this.back = back;
    }

    public void commandAction(Command c, Item item) {
        SelecionarArquivo se = new SelecionarArquivo();
        se.setListener(this);
        se.switchToFolder();
        Recados.setCurrent(se);
    }

    public void cancela() {
        Recados.setCurrent(this);
    }
}
